/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ajustecurvas.controller;

import ajustecurvas.Ponto;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Rafael Tosta
 */
public class LinearAjusteController extends AjusteController {

    private ArrayList<Double> xValues = new ArrayList<Double>();
    private ArrayList<Double> yValues = new ArrayList<Double>();
    private Double somaX = 0.0, somaY = 0.0, somaXQ = 0.0, somaYQ = 0.0, somaProdutoXY = 0.0;
    private int numPoints = 0;
    Double a = 0.0, b = 0.0, r = 0.0;

    @Override
    public List<Ponto> calcular(List<Ponto> medidas) {
        ArrayList<Ponto> p = new ArrayList<Ponto>();
        this.numPoints = medidas.size();
        for (int i = 0; i < medidas.size(); i++) {
            Ponto get = medidas.get(i);
            addPoint(get.getX(), get.getY());
        }
        a = (numPoints * somaProdutoXY - somaX * somaY) / (numPoints * somaXQ - somaX * somaX);
        b = (somaY - a * somaX) / numPoints;
        
        for (int i = 0; i < this.numPoints; i++) {
            Double y = a * this.xValues.get(i) + b;
            Ponto no = new Ponto(this.xValues.get(i), y);
            p.add(no);
        }

        return p;
    }

    @Override
    public String getEquacao() {
        DecimalFormat df = new DecimalFormat("0.00");
        String A = df.format(a);
        String B = df.format(b);
        String eq = A + "* X +" + B;
        if (b < 0) {
            return eq = A + "* x " + B;
        }

        return eq;
    }

    @Override
    public double getQualidade() {
        return r = (numPoints * somaProdutoXY - somaX * somaY) / Math.sqrt((numPoints * somaXQ - somaX * somaX) * (numPoints * somaYQ - somaY * somaY));
    }

    public void addPoint(Double x, Double y) {
        xValues.add(x);
        yValues.add(y);
        somaX += x;
        somaY += y;
        somaXQ += x * x;
        somaYQ += y * y;
        somaProdutoXY += x * y;
    }
}
